#ifndef SYMBOLTABLE_H
#define SYMBOLTABLE_H

#include <string>
#include <vector>
#include <unordered_map>
#include <memory>
#include "ASTNode.h"
// 符号类型
enum class SymbolType {
    VARIABLE = 0,  // 变量
    FUNCTION = 1,  // 函数
    PARAMETER = 2  // 参数
};

// 符号条目
struct SymbolEntry {
    std::string name;
    SymbolType type;
    std::string dataType;  // "int" 或 "void"
    int scopeLevel;        // 作用域层级
    int stackOffset;       // 栈偏移量（相对于当前函数栈帧）
};

// 符号表类
class SymbolTable {
private:
    std::unordered_map<std::string, SymbolEntry> entries;
    int currentScope = 0;   // 当前作用域层级
    int stackPointer = 0;   // 当前栈指针（用于计算偏移量）

public:
    // 进入新作用域
    void enterScope();

    // 退出作用域（removeSymbols = true 时删除当前作用域的符号）
    void exitScope(bool removeSymbols = false);

    // 添加变量
    bool addVariable(const std::string& name, const std::string& dataType);

    // 添加函数
    bool addFunction(const std::string& name, const std::string& returnType);

    // 添加参数
    bool addParameter(const std::string& name, const std::string& dataType);

    // 查找符号
    SymbolEntry* lookup(const std::string& name);

    // 打印符号表（调试用）
    void print() const;

    // 获取当前栈大小
    int getStackSize() const;

    // 重置栈指针（用于新函数的栈帧）
    void resetStackPointer();
};

// 符号表构建器
class SymbolTableBuilder {
private:
    SymbolTable globalTable;
    SymbolTable* currentTable = &globalTable;

public:
    // 构建符号表
    void build(ASTNode* root);

    // 打印符号表
    void printSymbolTable();
    
    // 获取全局符号表
    SymbolTable& getGlobalTable() { return globalTable; }

private:
    // 处理函数定义
    void processFunction(ASTNode* funcDef);

    // 处理语句块
    void processBlock(ASTNode* block);

    // 处理语句
    void processStatement(ASTNode* stmt);

    // 处理表达式
    void processExpression(ASTNode* expr);
};

#endif // SYMBOLTABLE_H